perm filename VHACK.SAI[GHK,HPM] blob sn#172542 filedate 1975-08-12 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "VMAP"
C00003 00003	PROCEDURE HACK
C00005 00004	LWD←LOCATION(WD)
C00008 ENDMK
C⊗;
BEGIN "VMAP"

INTEGER TRUNCATE,ATTENUATE,NEGATE,CONTOUR;
INTEGER EOF,I,WD,LWD;
DEFINE N=63;
DEFINE MASK='377, OBPS=8,IBPS=6;
DEFINE CHN=1;

INTEGER ARRAY TABL[0:N];

REAL GAMMA;

DEFINE MAPADR='771000;

INTEGER PROCEDURE GAMFN(INTEGER I);
   BEGIN
   INTEGER M;
   M←1 LSH OBPS;
   RETURN(M*(I/M)↑GAMMA);
   END;

PROCEDURE MAPSET(INTEGER ARRAY TABL);
   BEGIN
   INTEGER WD;
   WD←1 LSH 35 + 1 LSH 17 + MAPADR LSH -1;
   USETO(CHN,LOCATION(WD));
   USETI(CHN,LOCATION(WD));
   ARRYOUT(CHN,TABL[0],N+1);
   END;
PROCEDURE HACK;
   BEGIN
   OWN INTEGER ARRAY SW10ST[0:20];
   OWN INTEGER V,I;

   SIMPLE PROCEDURE SWTEN;
      BEGIN
      V←TABL[0];
      FOR I←0 STEP 1 UNTIL N-1 DO TABL[I]←TABL[I+1];
      TABL[N]←V;
      WD←1 LSH 35 + 1 LSH 17 + MAPADR LSH -1;
      USETO(CHN,LWD);
      USETI(CHN,LWD);
      ARRYOUT(CHN,TABL[0],N+1);
      END;

      START_CODE
      LABEL SW10,DUN,SW10A,SW10B;

      HRLZI   1,'400003;
      HRRI    1,SW10;
      CALLI   1,'400003;
      JRST    DUN;

SW10: MOVEI   '17,ACCESS(SW10ST[1]);
      JRST    2,@SW10A; SW10A: SW10B; SW10B:
      PUSHJ   '17,SWTEN;
      CALLI   '400024;

DUN:  SKIP            ;
      END;

   WHILE INCHRS<0 DO CALL(1,"SLEEP");

   END;
LWD←LOCATION(WD);

OPEN(CHN,"ELF",'17,0,0,0,0,EOF);
GAMMA←1;
CONTOUR←ATTENUATE←TRUNCATE←0;
NEGATE←FALSE;

WHILE TRUE DO
   BEGIN
   STRING STR;
   INTEGER C;
   REAL X;

   OUTSTR("*");
   STR←INCHWL;
   C←LOP(STR);
   X←REALSCAN(STR,0);
   CASE C OF
      BEGIN
      ["G"] GAMMA←X;
      ["←"] CONTOUR←X;
      ["→"] ATTENUATE←X;
      ["T"] TRUNCATE←X;
      ["H"] HACK;
      ["-"] NEGATE←NOT(NEGATE)
      END;

   FOR I←0 STEP 1 UNTIL N DO
      BEGIN
      INTEGER V;
      V←I LSH (OBPS-IBPS);
      V←((V LSH CONTOUR) LAND MASK) LOR (V LSH (CONTOUR-OBPS));
      V←GAMFN(V);
      V←V LSH -ATTENUATE;
      V←V LAND (-1 LSH TRUNCATE);
      IF NEGATE THEN V←V XOR MASK;
      TABL[I]←V;
      END;

   MAPSET(TABL);
   END;

RELEASE(CHN);

END;